class Solution {
public:
    long long maximumTotalDamage(vector<int>& power) {
        
        long long llRet=0;
        unordered_map<int,int> has;
        vector<int> vecArr;
        vecArr.push_back(-2);
        for(int i=0;i<power.size();++i){
            ++has[power[i]];
            if(has[power[i]]==1){
                vecArr.push_back(power[i]);
            }
        }
        vector<long long> dp(vecArr.size());
        sort(vecArr.begin(),vecArr.end());
        for(int i=1;i<dp.size();++i){
            int x=vecArr[i];
            int c=has[x];
            int j=i-1;
            while(vecArr[j]>=x-2){
                --j;
            }
            dp[i]=max(dp[i-1],dp[j]+static_cast<long long>(x)*c);
        }

        return dp[dp.size()-1];
    }
};
